/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package session;

import entity.Langue;
import entity.Produit;
import entity.TypeProduit;
import java.util.Collection;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import managers.ProduitEtDescrip;
import managers.ProduitManager;

/**
 *
 * @author livetnediser
 */
@Stateless
public class ProduitFacade extends AbstractFacade<Produit> {
    ProduitManager pm = new ProduitManager();
    
    @PersistenceContext(unitName = "SexyShopPU")
    private EntityManager em;

    protected EntityManager getEntityManager() {
        return em;
    }

    public ProduitFacade() {
        super(Produit.class);
    }
    
	// Trouver tous les produits d'une categorie donnee
    public List<Produit> findByTypeGen(int categorie) {
        List<Produit> aux = em.createQuery("SELECT p FROM Produit p WHERE p.idTypeProdGenerique = :categorie")
        .setParameter("categorie", categorie)
        .getResultList();
	if(aux != null && aux.size()>0){
	    return aux;
	} else{
	    return null;
	}
    }
    
    // Trouver tous les produits d'une sous-categorie donnee 
    public List<Produit> findByTypeSpec(int categorie) {
        List<Produit> aux = em.createQuery("SELECT p FROM Produit p WHERE p.idTypeProdSpecifique = :categorie")
        .setParameter("categorie", categorie)
        .getResultList();
	if(aux != null && aux.size()>0){
	    return aux;
	} else{
	    return null;
	}
    }
      
    public List<Produit> findByType(int categorieG, int categorieS) {
        List<Produit> aux = em.createQuery("SELECT p FROM Produit p WHERE p.idTypeProdSpecifique = :categorieG AND p.idTypeProdSpecifique = :categorieS")
        .setParameter("categorieG", categorieG)
        .setParameter("categorieS", categorieS)
        .getResultList();
	if(aux != null && aux.size()>0){
	    return aux;
	} else{
	    return null;
	}
    }

    public List<ProduitEtDescrip> findProductsByTypeProduit(TypeProduit typeProd, Langue langue) {
        
         List<ProduitEtDescrip> productsEtDesc = pm.getProdEtDescrip(langue, typeProd, true);
         
	if(productsEtDesc != null && productsEtDesc.size()>0){
	    return productsEtDesc;
	} else{
	    return null;
	}
    }
    
	// Trouver un produit par son id
    public Produit findProduitById(String idString) {
        System.out.println("idString = " + idString);
        try{
            int id = Integer.parseInt(idString);
            List<Produit> prod = em.createQuery("SELECT t FROM Produit t WHERE t.idproduit = :id")
                .setParameter("id", id)
                .getResultList();
        return prod.get(0);
        }catch(Exception npe){
            System.out.println("ERREUR : l'id fournit est nul");
            npe.printStackTrace();
        }
        return null;
    }
    
	// Trouver tous les produits de promotion (ayant une remise)
        public List<Produit> findProduitWithRemise() {
            List<Produit> prod = em.createQuery("SELECT t FROM Produit t WHERE t.remise <> 0")
                .getResultList();
            if(prod != null && prod.size()>0){
                return prod;
            } else{
                return null;
            }
        }
    // Trouver tous les produits, classe dans l'ordre decroissant en fonction du nombre de vente
        public List<Produit> findProduitTop() {
            List<Produit> prod = em.createQuery("SELECT t FROM Produit t WHERE t.nbVentes <> 0 ORDER BY t.nbVentes DESC")
                .getResultList();
            if(prod != null && prod.size()>0){
                return prod;
            } else{
                return null;
            }
        }
	
	// Trouver tous les produits correspondant au tag donne
	public List<Produit> findByTag(String tag){
            List<Produit> prod = em.createQuery("SELECT t FROM Produit t WHERE t.tags LIKE :tag")
                 .setParameter("tag", '%'+tag +'%')
                 .getResultList();
            if (prod != null && prod.size() > 0) {
                return prod;
            } else {
                return null;
            }
        }
    }
